package everyday;

import java.util.HashMap;
import java.util.Map;

/**
 * @author zhangmin
 * @create 2022-04-27 15:49
 * 给你一个字符串 s 、一个字符串 t 。返回 s 中涵盖 t 所有字符的最小子串。如果 s 中不存在涵盖 t 所有字符的子串，则返回空字符串 "" 。
 *
 * 思路：
 * 滑动窗口
 */
public class minWindow75 {
    public String minWindow(String s, String t) {
        Map<Character,Integer> window=new HashMap<>(),need=new HashMap<>();
        for (char tc:t.toCharArray()) {
            need.put(tc,need.getOrDefault(tc,0)+1);
        }
        int left=0,right=0;
        int start=-1,len=Integer.MAX_VALUE;
        int valid=0;
        while (right<s.length()){
            char c=s.charAt(right);
            right++;
            if (need.containsKey(c)){
                window.put(c,window.getOrDefault(c,0)+1);
                if (window.get(c).equals(need.get(c))){
                    valid++;
                }
            }
            while (left<right&&valid>=need.size()){
                if (right-left<=len){
                    start=left;
                    len=right-left;
                }
                char d=s.charAt(left);
                if (need.containsKey(d)){
                    if (window.get(d).equals(need.get(d))){
                        valid--;
                    }
                    window.put(d,window.getOrDefault(d,0)-1);
                }
                left++;
            }
        }
        return start==-1?"":s.substring(start,start+len);
    }
}
